iT邦幫忙

2023 iThome 鐵人賽

DAY 29
0
自我挑戰組

python的撞坑紀錄系列 第 32

基本資料庫

  • 分享至 

  • xImage
  •  

DataBase

Reflex使用sqlmodel提供內建ORM包裝SQLAlchemy。
不過,在說這些之前,我們先來看sqlite3
我自己也很久沒用到資料庫了,順便複習。

我們保險,直接從DB Brower for SQLite去創建一個資料庫(因為reflex不給開,說是被鎖住,那我們另外抓個資料夾吧)

打開頁面長這樣。
https://ithelp.ithome.com.tw/upload/images/20231011/201413252avfThakAM.png
創立資料庫
https://ithelp.ithome.com.tw/upload/images/20231011/201413255Aq32JiIRY.png

定義好後,按下ok
https://ithelp.ithome.com.tw/upload/images/20231011/201413255XQWBsIZcn.png

這裡會看到資料庫裡的鍵。
https://ithelp.ithome.com.tw/upload/images/20231011/20141325UirPmI9uQM.png

打開方才丟資料庫的那個資料夾,直接試著插入。

import sqlite3
dbfile = "xia.db"
conn = sqlite3.connect(dbfile)
name = 'xia'
password = '1111'
sql_str = "insert into users(name, password) values('{}',{});".format(name, password)
conn.execute(sql_str)
conn.commit()
conn.close()

再運行以上程式碼後,重開一次db,會出現如下圖
https://ithelp.ithome.com.tw/upload/images/20231011/20141325h0J3ZGpn07.png

第一階段任務完成,這時候我打算先把這個資料庫丟到my_reflex_app的專案裡。
然後更改設定檔如下(在 rxconfig.py 內)

import reflex as rx

class MyreflexappConfig(rx.Config):
    pass

config = MyreflexappConfig(
    app_name="my_reflex_app",
    # env = rx.Env.DEV,
    db_url = "sqlite:///xia.db",
    tailwind = {
        "theme": {
            "extend": {},
        },
        "plugins": ["@tailwindcss/typography"],
    },
)

不過...大概率是不會弄到這邊的,我自己在弄得時候不熟悉,所以有特地拉出來寫。
一樣是在裡面新增一個py

# read.py
import sqlite3

conn = sqlite3.connect('xia.db')

cursor = conn.cursor()

cursor.execute(
    '''
        CREATE TABLE IF NOT EXISTS users (
            name TEXT,
            password TEXT
        )
    '''
)


sql_str1 = "insert into users(name, password) values('{}',{});".format('a', '22')
sql_str2 = "insert into users(name, password) values('{}',{});".format('xxx', '655656')

cursor.execute(sql_str1)
cursor.execute(sql_str2)

conn.commit()
conn.close()

這樣就可以確認當前資料夾裡面的xia.db是不是存在,裡面有沒有東西我們等結束再抓出來看。

好的,我們先開一個state的資料夾在my_reflex_app內部。

my_reflex_app
|
--state
|
--my_reflex_app.py

這樣,我們繼續在state資料夾內創建以下幾個檔案,並寫入

# state/models.py
import reflex as rx

class User(rx.Model, table=True):
    name: str
    password: str

這邊用的是sqlmodel,詳情可以點開來閱讀。
建表必須要有繼承類rx.Model

# state/state.py
import reflex as rx
from typing import Optional
from .models import User


class State(rx.State):

    user: Optional[User] = None

這邊抓到了models.py檔裡的User,確認無誤後,整理一下這個資料夾內部所有的class

# state/__init__.py
from .state import State
from . import models

好的,接下來我們回頭來看my_reflex_app.py,先處理class

class RegisterState(State):
    # Register to xia.db

    name_field: str = ""
    password_field: str = ""

    def sign_up(self):
        dbfile = "xia.db"
        conn = sqlite3.connect(dbfile)
        name = self.name_field
        password = self.password_field
        sql_str = "insert into users(name, password) values('{}',{});".format(name, password)
        conn.execute(sql_str)
        conn.commit()
        conn.close()
        print('save')

再來是index


def index():
    return rx.vstack(
        rx.box(
            rx.heading("註冊", margin_bottom = "1rem"),
            rx.input(
                placeholder = "名字",
                margin_bottom = "1rem",
                on_change = RegisterState.set_name_field,
            ),
            rx.input(
                type_= " password",
                placeholder = "密碼",
                margin_bottom = "1rem",
                on_change = RegisterState.set_password_field,
            ),
            rx.button(
                "註冊", 
                on_click = RegisterState.sign_up,
            ),
        ),
    )

最後啟動它。

app = rx.App(
    stylesheets = [
        # 之前寫的css沒刪喔
        "styles.css", 
    ],
)
app.add_page(index)
app.compile()

打開首頁可以看見下圖。
https://ithelp.ithome.com.tw/upload/images/20231011/20141325fFW6CTgXsw.png

隨意輸入如下圖
https://ithelp.ithome.com.tw/upload/images/20231011/20141325CfWdFQYCty.png

這邊同樣的,我們打開 DB Brower for SQLite
Brower Data就可以看見所有數據了。
https://ithelp.ithome.com.tw/upload/images/20231011/20141325hutKnwcbKD.png

目前就先這樣吧,最基本的就應該是這個了...
東西放在github


後面還有資料庫連線、查詢...查詢的部分我就跳過了,之後有時間再另外補上來,明天是最後一天啦...這篇寫好久,其實很大一部份就是官網上寫得太簡陋,希望可以弄成小白文那種就再好不過了QQ。


上一篇
Style後篇
下一篇
部署(?)以及感言
系列文
python的撞坑紀錄33
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
xiaLotus
iT邦新手 4 級 ‧ 2023-10-11 19:31:37

github上以後可能會再做更動,不過上面的肯定能跑/images/emoticon/emoticon06.gif

我要留言

立即登入留言